package com.itcz.maker.generator.file;

import cn.hutool.core.io.FileUtil;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 动态文件生成器
 */
public class DynamicFileGenerator {

    /**
     * 使用相对路径生成文件(因为打成jar包后无法通过绝对路径拿到resource中的ftl模板文件）
     *
     * @param relativeInputPath 相对输入路径
     * @param outputPath 输出路径
     * @param model 数据模型
     * @throws IOException
     * @throws TemplateException
     */
    public static void doGenerate(String relativeInputPath,
                                  String outputPath,
                                  Object model) throws IOException, TemplateException {
        // new 出 Configuration 对象，参数为 FreeMarker 版本号
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_32);

        int lastSplitIndex = relativeInputPath.lastIndexOf("/");
        // 基础包名
        String basePackagePath = relativeInputPath.substring(0, lastSplitIndex);
        // 模板文件名
        String templateName = relativeInputPath.substring(lastSplitIndex + 1);

        // 指定模板文件所在的路径
        TemplateLoader templateLoader = new ClassTemplateLoader(DynamicFileGenerator.class, basePackagePath);
        configuration.setTemplateLoader(templateLoader);

        // 设置模板文件使用的字符集
        configuration.setDefaultEncoding("utf-8");

        // 创建模板对象，加载指定模板
        Template template = configuration.getTemplate(templateName);

        // 取消数字分隔符
        configuration.setNumberFormat("0.######");

        // 如果输出地址不存在，则创建文件和目录
        if(!FileUtil.exist(outputPath)) {
            // 利用hutool工具类创建文件和目录
            FileUtil.touch(outputPath);
        }

        // 生成
        Writer out = new OutputStreamWriter(Files.newOutputStream(Paths.get(outputPath)), StandardCharsets.UTF_8);
        template.process(model, out);

        // 关闭数据流对象
        out.close();
    }

    /**
     * 生成文件
     *
     * @param inputPath 模板文件输入路径
     * @param outputPath 输出路径
     * @param model 数据模型
     * @throws IOException
     * @throws TemplateException
     */
    public static void doGenerateByPath(String inputPath,
                                        String outputPath,
                                        Object model) throws IOException, TemplateException {
        // new 出 Configuration 对象，参数为 FreeMarker 版本号
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_32);

        // 指定模板文件所在的路径
        File templateDir = new File(inputPath).getParentFile();
        configuration.setDirectoryForTemplateLoading(templateDir);

        // 设置模板文件使用的字符集
        configuration.setDefaultEncoding("utf-8");

        // 创建模板对象，加载指定模板
        String templateName = new File(inputPath).getName();
        Template template = configuration.getTemplate(templateName);

        // 取消数字分隔符
        configuration.setNumberFormat("0.######");

        // 如果输出地址不存在，则创建文件和目录
        if(!FileUtil.exist(outputPath)) {
            // 利用hutool工具包创建文件和目录
            FileUtil.touch(outputPath);
        }

        // 生成
        Writer out = new OutputStreamWriter(Files.newOutputStream(Paths.get(outputPath)), StandardCharsets.UTF_8);
        template.process(model, out);

        // 关闭数据流对象
        out.close();
    }
}
